#include "PWM.h"

// PWM周期计数器
static unsigned char PWM_Count = 0;
// 当前PWM占空比值 (0-100)
static unsigned char PWM_Duty = 0;

/*******************************************************************************
* 函数名         : PWM_Init
* 功能描述       : 初始化PWM输出
* 输入           : 无
* 输出           : 无
* 说明           : 使用定时器0，模式1(16位定时器)，初始化定时器0用于产生PWM
*******************************************************************************/
void PWM_Init(void)
{
    // 配置定时器0
    TMOD &= 0xF0;    // 清除定时器0的配置位
    TMOD |= 0x01;    // 设置定时器0为模式1(16位定时器)
    
    // 设置定时器初值，12MHz晶振下定时100us
    TH0 = 0xFF;
    TL0 = 0x9C;
    
    // 开启定时器0中断
    ET0 = 1;
    // 启动定时器0
    TR0 = 1;
    // 开启总中断
    EA = 1;
    
    // 初始PWM输出为低电平
    PWM_PIN = 0;
}

/*******************************************************************************
* 函数名         : PWM_SetDuty
* 功能描述       : 设置PWM占空比
* 输入           : duty - PWM占空比值，范围0-100
* 输出           : 无
*******************************************************************************/
void PWM_SetDuty(unsigned char duty)
{
    // 限制占空比范围在0-100之间
    if(duty > 100)
        duty = 100;
    
    PWM_Duty = duty;
}

/*******************************************************************************
* 函数名         : Timer0_ISR
* 功能描述       : 定时器0中断服务函数，用于产生PWM波形
* 输入           : 无
* 输出           : 无
*******************************************************************************/
void Timer0_ISR(void) interrupt 1
{
    // 重新加载定时器初值
    TH0 = 0xFC;
    TL0 = 0x66;
    
    // PWM计数值增加
    PWM_Count++;
    if(PWM_Count >= 100)  // PWM周期结束
        PWM_Count = 0;
    
    // 根据计数值和占空比控制输出
    if(PWM_Count < PWM_Duty)
        PWM_PIN = 1;    // 输出高电平
    else
        PWM_PIN = 0;    // 输出低电平
}